.text
.globl Switch
Switch:
#ifdef __x86_64__
/*
    r12 r13 r14 r15 rip rsp rbx rbp
    0   8   16  24  32  40  48  56
    rdi->src  rsi->dst
*/
    movq %rdx, %rax
    movq (%rsp), %rdx   // get ret addr
    leaq 8(%rsp), %rcx  // get ret rsp
    movq %r12, (%rdi)
    movq %r13, 8(%rdi)
    movq %r14, 16(%rdi)
    movq %r15, 24(%rdi)
    movq %rdx, 32(%rdi)  //save ret addr
    movq %rcx, 40(%rdi)  //save ret rsp
    movq %rbx, 48(%rdi)
    movq %rbp, 56(%rdi)
    movq (%rsi), %r12
    movq 8(%rsi), %r13
    movq 16(%rsi), %r14
    movq 24(%rsi), %r15
    movq 32(%rsi), %rdx // restore ret addr
    movq 40(%rsi), %rcx // restore ret rsp
    movq 48(%rsi), %rbx
    movq 56(%rsi), %rbp
    movq %rcx, %rsp
    movq %rax, %rdi
    jmpq *%rdx
#else
    #error "platform not support"
#endif
